﻿using Avalonia.Controls;

namespace Digitalmes.AvaloniaUI.ViewModels;

/// <summary>
/// 主视图 ViewModel。
/// </summary>
public sealed partial class MainViewViewModel : ViewModelBase
{
    private string? _activeMenuKey; // 已激活的菜单 Key

    /// <summary>
    /// 左侧应用标题。
    /// </summary>
    public string Title { get; }

    /// <summary>
    /// 左侧菜单。
    /// </summary>
    public MenuViewModel Menus { get; }

    /// <summary>
    /// Body 内容（ViewModel）
    /// </summary>
    [ObservableProperty]
    private object? _content;

    public MainViewViewModel()
    {
        // 注册弱引用消息，用于接收菜单 ViewModel 激活时发送的消息。
        WeakReferenceMessenger.Default.Register<MainViewViewModel, ValueChangedMessage<string>, string>(this, "navigation", OnNavigation);

        // 从配置文件中获取信息
        var configuration = App.Current!.Services.GetRequiredService<IConfiguration>();
        Title = configuration["App:Title"] ?? "数字应用客户端";

        // 获取菜单
        Menus = App.Current!.Services.GetRequiredService<MenuViewModel>();

        // 启动后加载菜单配置首项
        string menuKey = Menus.MenuItems.FirstOrDefault()?.Key ?? "";
        OnNavigation(this, new ValueChangedMessage<string>(menuKey));
    }

    private void OnNavigation(MainViewViewModel vm, ValueChangedMessage<string> message)
    {
        string menuKey = message.Value;
        if (string.IsNullOrEmpty(menuKey))
        {
            Content = new TextBlock { Text = "系统还没有配置菜单" };
            return;
        }

        // 当点击的菜单与已激活的菜单相同，直接返回
        if (_activeMenuKey == menuKey)
        {
            return;
        }

        _activeMenuKey = menuKey;

        var router = App.Current!.Services.GetRequiredService<IViewRouter>();
        var vmType = router.Routes.FirstOrDefault(s => menuKey.Equals(s.AliasName, StringComparison.OrdinalIgnoreCase))?.ViewModelType;
        Content = vmType != null ? App.Current?.Services.GetService(vmType) : new TextBlock { Text = $"没找到指定的 {menuKey} 对应的 ViewModel" };
    }
}
